package com.redepronik.negosys.invfac.service;

import static com.redepronik.negosys.utils.Utils.presentaMensaje;

import java.util.List;
import java.util.Set;

import javax.faces.application.FacesMessage;
import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import javax.validation.ValidatorFactory;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.redepronik.negosys.invfac.dao.CaracteristicaDao;
import com.redepronik.negosys.invfac.entity.Caracteristica;

@Service
public class CaracteristicaServiceImpl implements CaracteristicaService {

	@Autowired
	private CaracteristicaDao caracteristicaDao;

	private ValidatorFactory factory = Validation
			.buildDefaultValidatorFactory();
	private Validator validator = factory.getValidator();

	public void actualizar(Caracteristica caracteristica) {
		caracteristica.setNombre(caracteristica.getNombre().toUpperCase());
		Set<ConstraintViolation<Caracteristica>> violations = validator
				.validate(caracteristica);
		if (violations.size() > 0)
			for (ConstraintViolation<Caracteristica> cv : violations)
				presentaMensaje(FacesMessage.SEVERITY_INFO, cv.getMessage());
		else if (caracteristicaDao.comprobarIndices(Caracteristica.class,
				"nombre", caracteristica.getNombre().toUpperCase(),
				String.valueOf(caracteristica.getCaracteristicaid())))
			presentaMensaje(FacesMessage.SEVERITY_ERROR,
					"LA CARACTERÍSTICA YA EXISTE", "error", false);
		else {
			caracteristicaDao.actualizar(caracteristica);
			presentaMensaje(FacesMessage.SEVERITY_INFO,
					"CARACTERISTICA ACTUALIZADA DE MANERA CORRECTA", "error",
					true);
		}
	}

	public void eliminar(Caracteristica caracteristica) {
		caracteristica.setActivo(caracteristica.getActivo() ? false : true);
		caracteristicaDao.actualizar(caracteristica);
		if (caracteristica.getActivo())
			presentaMensaje(FacesMessage.SEVERITY_INFO,
					"SE ACTIVÓ LA CARACTERÍSTICA " + caracteristica.getNombre());
		else
			presentaMensaje(
					FacesMessage.SEVERITY_INFO,
					"SE DESACTIVÓ LA CARACTERÍSTICA "
							+ caracteristica.getNombre());
	}

	public List<Caracteristica> insertar(Caracteristica caracteristica) {
		caracteristica.setNombre(caracteristica.getNombre().toUpperCase());
		caracteristica.setActivo(true);

		Set<ConstraintViolation<Caracteristica>> violationsCaracteristica = validator
				.validate(caracteristica);
		if (violationsCaracteristica.size() > 0)
			for (ConstraintViolation<Caracteristica> cv : violationsCaracteristica)
				presentaMensaje(FacesMessage.SEVERITY_INFO, cv.getMessage());
		else if (caracteristicaDao.comprobarIndices(Caracteristica.class,
				"nombre", caracteristica.getNombre(),
				String.valueOf(caracteristica.getCaracteristicaid())))
			presentaMensaje(FacesMessage.SEVERITY_ERROR,
					"LA CARACTERÍSTICA YA EXISTE", "error", false);
		else {
			caracteristicaDao.insertar(caracteristica);
			presentaMensaje(FacesMessage.SEVERITY_INFO,
					"CARACTERISTICA INGRESADA DE MANERA CORRECTA", "error",
					true);
		}
		return obtener(null);
	}

	public List<Caracteristica> obtener(Boolean activo) {
		return caracteristicaDao
				.obtener(Caracteristica.class, "nombre", activo);
	}

	public Caracteristica obtenerPorId(Integer id) {
		return caracteristicaDao.obtenerPorId(Caracteristica.class, id);
	}

}